#ifndef _SINGLY_LINKED_LIST_H
#define _SINGLY_LINKED_LIST_H

#include <stdbool.h>
#include <stdlib.h>

#define NULL ((void*)0)

// 提示：32位系统4字节对齐，64位系统8字节对齐

// 定义数据部分的结构体
typedef struct
{
    char string[11];
    char num;
} DATA;

// 定义节点部分的结构体
typedef struct node {
    DATA data;
    struct node* next;
} NODE;

typedef NODE* list;

// 获取链表长度
// plist：链表
// 返回：链表长度
unsigned int list_len(list plist);

// 添加一个节点
// *plist：链表的头节点
// data：添加节点的数据
// 返回：0表示添加失败，1表示添加成功
bool list_append(list* plist, DATA data);

// 根据索引读取链表数据
// plist：链表
// index：索引
// 返回：链表对应索引的数据
DATA list_read(list plist, unsigned char index);

// 根据索引弹出链表节点并返回弹出节点的指针
// plist：链表
// index：索引
// 返回：弹出的节点的指针
NODE* list_pop(list* plist, unsigned char index);

// 根据索引删除链表节点
// plist：链表
// index：索引
void list_remove(list* plist, unsigned char index);

// 根据索引修改链表数据
// plist：链表
// index：索引
// data：修改后的数据
void list_modify(list plist, unsigned char index, DATA data);

int list_find(list plist, DATA* data);

// 插入一个节点
// *plist：链表的头节点
// index：插入节点的位置索引
// data：插入节点的数据
// 返回：0表示添加失败，1表示添加成功
bool list_insert(list* plist, unsigned char index, DATA data);

void list_clear(list* plist);

#endif